# -*- coding: utf-8 -*-
import hashlib
from datetime import datetime
from ebank.shortcuts import *


class Send(Handler):
    rule = Rule('/')
    def get(self):
        tmpl = env.get_template('ChinaBank.html')
        return Response(tmpl.render())

    def post(self):
        # 商户号，这里为测试商户号1001，替换为自己的商户号(老版商户号为4位或5位,新版为8位)即可
        v_mid = '1001'
        # 请填写返回url,地址应为绝对路径,带有http协议
        v_url = 'http://localhost/receive/'
        # 如果您还没有设置MD5密钥请登陆我们为您提供商户后台，地址：https://merchant3.chinabank.com.cn/
        # 登陆后在上面的导航栏里可能找到“B2C”，在二级导航栏里有“MD5密钥设置”
        # 建议您设置一个16位以上的密钥或更高，密钥最多64位，但设置16位已经足够了
        key = 'test'
        v_oid = self.request.form.get('v_oid', u'').strip()
        if not v_oid:
            now = datetime.now()
            v_oid = '-'.join([now.strftime('%Y%m%d'), v_mid, now.strftime('%H%M%S')])

        v_amount = self.request.form.get('v_amount', u'').strip() # 支付金额
        v_moneytype = "CNY"
        text = v_amount + v_moneytype + v_oid + v_mid + v_url + key
        v_md5info = hashlib.md5(text).hexdigest().upper()

        tmpl = env.get_template('send.html')
        return Response(tmpl.render(
            request     = self.request,
            v_mid       = v_mid,
            v_url       = v_url,
            v_oid       = v_oid,
            v_amount    = v_amount,
            v_moneytype = v_moneytype,
            v_md5info   = v_md5info,
        ))


class Receive(Handler):
    rule = Rule('/receive/')
    def post(self):
        key = 'test'

        v_oid       = self.request.form.get('v_oid', u'').strip()       # 商户发送的v_oid定单编号
        v_pmode     = self.request.form.get('v_pmode', u'').strip()     # 支付方式（字符串）
        v_pstatus   = self.request.form.get('v_pstatus', u'').strip()   # 支付状态 ：20（支付成功）；30（支付失败）
        v_pstring   = self.request.form.get('v_pstring', u'').strip()   # 支付结果信息 ： 支付完成（当v_pstatus=20时）；失败原因（当v_pstatus=30时,字符串）；
        v_amount    = self.request.form.get('v_amount', u'').strip()    # 订单实际支付金额
        v_moneytype = self.request.form.get('v_moneytype', u'').strip() # 订单实际支付币种
        remark1     = self.request.form.get('remark1', u'').strip()     # 备注字段1
        remark2     = self.request.form.get('remark2', u'').strip()     # 备注字段2
        v_md5str    = self.request.form.get('v_md5str', u'').strip()    # 拼凑后的MD5校验值

        md5string   = hashlib.md5(v_oid+v_pstatus+v_amount+v_moneytype+key).hexdigest().upper()
        
        if md5string != v_md5str:
            return Response('校验失败,数据可疑')
        elif v_pstatus != '20':
            return Response('支付失败')
        else:
            tmpl = env.get_template('receive.html')
            return Response(tmpl.render(
                v_md5str = v_md5str,
                v_oid = v_oid,
                v_pmode = v_pmode,
                v_pstring = v_pstring,
                v_amount = v_amount,
                v_moneytype = v_moneytype
            ))


class AutoReceive(Handler):
    rule = Rule('/autoreceive/')
    def post(self):
        # MD5密钥要跟订单提交页相同，如Send.asp里的 key = "test" ,修改""号内 test 为您的密钥
        # 如果您还没有设置MD5密钥请登陆我们为您提供商户后台，地址：https://merchant3.chinabank.com.cn/
        # 登陆后在上面的导航栏里可能找到“B2C”，在二级导航栏里有“MD5密钥设置”
        # 建议您设置一个16位以上的密钥或更高，密钥最多64位，但设置16位已经足够了
        key = 'test'
        v_oid       = self.request.form.get('v_oid', u'').strip()
        v_pmode     = self.request.form.get('v_pmode', u'').strip()
        v_pstatus   = self.request.form.get('v_pstatus', u'').strip()
        v_pstring   = self.request.form.get('v_pstring', u'').strip()
        v_amount    = self.request.form.get('v_amount', u'').strip()
        v_moneytype = self.request.form.get('v_moneytype', u'').strip()
        remark1     = self.request.form.get('remark1', u'').strip()
        remark2     = self.request.form.get('remark2', u'').strip()
        v_md5str    = self.request.form.get('v_md5str', u'').strip()

        md5string   = v_oid + v_pstatus + v_amount + v_moneytype + key
        if md5sring != v_md5str or v_pstatus != '20':
            return Response('error')
        else:
            # 支付成功
            # 商户系统的逻辑处理（例如判断金额，判断支付状态(20成功,30失败),更新订单状态等等）......
            return Response('ok')
